{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Face Depixelizer Rus",
      "provenance": [],
      "private_outputs": true,
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/tg-bomze/Face-Depixelizer/blob/master/Face_Depixelizer_Rus.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "siqzcgRRyr_n",
        "colab_type": "text"
      },
      "source": [
        "<b><font color=\"black\" size=\"+4\">Лицевой Депикселизатор</font></b>\n",
        "\n",
        "Принимая входное изображение с низким разрешением, Лицевой Депикселизатор на выходах генеративной модели (StyleGAN) подбирает такое изображение с высоким разрешением, которые при пикселизации даст максимально похожий результат с входным.\n",
        "\n",
        "<b><font color=\"black\" size=\"+2\">Базируется на:</font></b>\n",
        "\n",
        "**GitHub репозиторий**: [PULSE](https://github.com/adamian98/pulse)\n",
        "\n",
        "Статья: [PULSE: Self-Supervised Photo Upsampling via Latent Space Exploration of Generative Models](https://arxiv.org/abs/2003.03808)\n",
        "\n",
        "Авторы: **[Alex Damian](https://github.com/adamian98), [Sachit Menon](mailto:sachit.menon@duke.edu).**\n",
        "\n",
        "<b><font color=\"black\" size=\"+2\">Колаб собрал:</font></b>\n",
        "\n",
        "GitHub: [@tg-bomze](https://github.com/tg-bomze),\n",
        "Telegram: [@bomze](https://t.me/bomze),\n",
        "Twitter: [@tg_bomze](https://twitter.com/tg_bomze).\n",
        "\n",
        "---\n",
        "##### <font color='red'>В настоящее время Google Drive используется в качестве хранилища весов модели, поэтому из-за постоянных загрузок этих файлов при выполнении следующего блока может быть получено сообщение об ошибке «Google Drive Quota Exceeded» (Квота на Google Drive превышена) или «No such file or directory: '/content/pulse/runs/face.png'». Если вы столкнулись с этой ошибкой, повторите попытку позже в тот же день или вернитесь завтра.</font>\n",
        "\n",
        "```\n",
        "Чтобы начать, нажмите на кнопку (куда указывает красная стрелка), после чего дождитесь завершения выполнения блока.\n",
        "```\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fU0aGtD4Nl4W",
        "colab_type": "code",
        "cellView": "form",
        "colab": {}
      },
      "source": [
        "#@title <b><font color=\"red\" size=\"+3\">←</font><font color=\"black\" size=\"+3\"> Начинаем!</font></b>\n",
        "#@markdown **После запуска этого блока вам будет необходимо прокрутить страницу вниз, а затем загрузить пиксельную квадратную фотографию, в которую целиком помещается вся человеческая голова. Нейронная сеть лучше всего работает на изображениях, в которых люди смотрят прямо в камеру. Пример:**\n",
        "\n",
        "#@markdown ![example](https://github.com/tg-bomze/Face-Depixelizer/raw/master/example.jpg)\n",
        "\n",
        "#@markdown *Обрезать фото вы можете [ТУТ](https://www.iloveimg.com/crop-image)*\n",
        "\n",
        "#@markdown ---\n",
        "import torch\n",
        "import torchvision\n",
        "from pathlib import Path\n",
        "if not Path(\"PULSE.py\").exists():\n",
        "  if Path(\"pulse\").exists():\n",
        "    %cd /content/pulse\n",
        "  else:\n",
        "    !git clone https://github.com/adamian98/pulse\n",
        "    %cd /content/pulse\n",
        "    !mkdir input/\n",
        "    toPIL = torchvision.transforms.ToPILImage()\n",
        "    toTensor = torchvision.transforms.ToTensor()\n",
        "    from bicubic import BicubicDownSample\n",
        "    D = BicubicDownSample(factor=1)\n",
        "\n",
        "import os\n",
        "from io import BytesIO\n",
        "import matplotlib.pyplot as plt\n",
        "import matplotlib.image as mpimg\n",
        "from PIL import Image\n",
        "from PULSE import PULSE\n",
        "from google.colab import files\n",
        "from bicubic import BicubicDownSample\n",
        "from IPython import display\n",
        "from IPython.display import display\n",
        "from IPython.display import clear_output\n",
        "import numpy as np\n",
        "from drive import open_url\n",
        "from mpl_toolkits.axes_grid1 import ImageGrid\n",
        "%matplotlib inline\n",
        "\n",
        "#@markdown ## Базовые настройки:\n",
        "#@markdown ##### *Если вы уже загрузили фотографию и просто хотите поэкспериментировать с настройками, то уберите галочку ниже*:\n",
        "upload_new_photo = True #@param {type:\"boolean\"}\n",
        "\n",
        "\n",
        "if upload_new_photo == True:\n",
        "  !rm -rf /content/pulse/input/face.png\n",
        "  clear_output()\n",
        "  uploaded = files.upload()\n",
        "  for fn in uploaded.keys():\n",
        "    print('Вы загрузили файл \"{name}\" размером {length} байт'.format(\n",
        "        name=fn, length=len(uploaded[fn])))\n",
        "  os.rename(fn, fn.replace(\" \", \"\"))\n",
        "  fn = fn.replace(\" \", \"\")\n",
        "\n",
        "  if(len(uploaded.keys())!=1): raise Exception(\"Вам необходимо загрузить только одно изображение.\")\n",
        "\n",
        "  face = Image.open(fn)\n",
        "  face = face.resize((1024, 1024), Image.ANTIALIAS)\n",
        "  face = face.convert('RGB')\n",
        "  face_name = 'face.png'\n",
        "  face.save(face_name)\n",
        "  %cp $face_name /content/pulse/input/\n",
        "\n",
        "  images = []\n",
        "  imagesHR = []\n",
        "  imagesHR.append(face)\n",
        "  face = toPIL(D(toTensor(face).unsqueeze(0).cuda()).cpu().detach().clamp(0,1)[0])\n",
        "  images.append(face)\n",
        "\n",
        "#@markdown ---\n",
        "#@markdown ## Расширенные настройки:\n",
        "#@markdown ##### *Если вы хотите получить более точный результат, измените следующие переменные, оптимально настроенные по умолчанию*:\n",
        "\n",
        "seed = 100 #@param {type:\"integer\"}\n",
        "noise_type = 'trainable'  #@param ['zero', 'fixed', 'trainable']\n",
        "optimizer = 'adam'  #@param ['sgd', 'adam','sgdm', 'adamax']\n",
        "learning_rate = 0.4 #@param {type:\"slider\", min:0, max:1, step:0.05}\n",
        "learning_rate_schedule = 'linear1cycledrop'  #@param ['fixed', 'linear1cycle', 'linear1cycledrop']\n",
        "steps = 100 #@param {type:\"slider\", min:100, max:1000, step:50}\n",
        "clear_output()\n",
        "\n",
        "seed = abs(seed)\n",
        "print('Примерное время генерации: {} сек.\\n'.format(round(0.23*steps)+6))\n",
        "!python run.py \\\n",
        "  -seed $seed \\\n",
        "  -noise_type $noise_type \\\n",
        "  -opt_name $optimizer \\\n",
        "  -learning_rate $learning_rate \\\n",
        "  -steps $steps \\\n",
        "  -lr_schedule $learning_rate_schedule\n",
        "\n",
        "#@markdown ---\n",
        "#@markdown *Если во время выполнения произошла ошибка или кнопка \"**Обзор**\" не активна, то попробуйте повторно запустить этот блок*\n",
        "\n",
        "fig, (ax1, ax2) = plt.subplots(1, 2)\n",
        "ax1.imshow(mpimg.imread('/content/pulse/input/face.png'))\n",
        "ax1.set_title('Оригинал')\n",
        "ax2.imshow(mpimg.imread('/content/pulse/runs/face.png'))\n",
        "ax2.set_title('Результат')\n",
        "plt.show()"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "DUfP6_7vTK3b",
        "colab_type": "code",
        "cellView": "form",
        "colab": {}
      },
      "source": [
        "#@title <b><font color=\"red\" size=\"+3\">←</font><font color=\"black\" size=\"+3\"> Скачать итоговое изображение</font></b>\n",
        "try: files.download('/content/pulse/runs/face.png')\n",
        "except: raise Exception(\"No result image\")"
      ],
      "execution_count": null,
      "outputs": []
    }
  ]
}